﻿/*
 * 角色具有的功能。系统角色是固定的，不给予新增角色的能力。
 * 但角色可以得到哪些权限，是可以动态分配的。
 * 
 * 2009-5-27
 * 
 * */

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

using EQT.Model;
using EQT.Dal;
using System.Collections.Generic;
public partial class RoleFunc : System.Web.UI.Page
{
    private DaTfunction datfunc = new DaTfunction(DaCommon.DefaultDb);
    private DaTrole datrole = new DaTrole(DaCommon.DefaultDb);

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            TreeViewFuncs.Attributes.Add("OnClick", "OnCheckBoxCheckChanged(event)");
            BindDDLRoles();
            //首次加载时必须手工调用一次
            BindTree(DDLRoles.SelectedValue);
        }
    }

    /// <summary>
    /// 绑定角色列表
    /// </summary>
    private void BindDDLRoles()
    {
        DataSet ds = datrole.Query(null);
        Utility.BindDataSet2Combox(ds, DDLRoles, "ROLE_NAME", "ROLE_ID");
    }

    /// <summary>
    /// 绑定树节点，显示某个角色拥有的Func_id
    /// </summary>
    private void BindTree(string role_id)
    {
        TreeViewFuncs.Nodes.Clear();

        Dictionary<string, TreeNode> tnDic = new Dictionary<string, TreeNode>();

        List<MoTfunction> listRoot = datfunc.GetEntities(" WHERE FUNC_ClASS='0'");
        #region 已有权限
        MoTfunction[] funcs = datfunc.GetRoleFunctions(role_id);
        System.Collections.Specialized.StringCollection sc = new System.Collections.Specialized.StringCollection();
        foreach (MoTfunction mo in funcs)
        {
            sc.Add(mo.Func_Id);
        }
        #endregion
        if (listRoot == null)
        {
            Utility.GlobalLog.WarnFormat("角色{0}没有任何权限资源", role_id);
            TreeViewFuncs.Nodes.Clear();
            return;
        }
        foreach (MoTfunction mo in listRoot)
        {
            //所有子功能(含根自身)
            DataSet ds = datfunc.GetFunctionTree(mo.Func_Id);
            if (ds != null && ds.Tables.Count == 1)
            {
                DataTable dt = ds.Tables[0];
                //首行一定是root
                TreeNode rootNode = new TreeNode((string)dt.Rows[0]["FUNC_NAME"], (string)dt.Rows[0]["FUNC_ID"]);
                TreeViewFuncs.Nodes.Add(rootNode);
                tnDic.Add(rootNode.Value, rootNode);
                rootNode.Checked=sc.Contains(rootNode.Value);               

                for (int i = 1; i < dt.Rows.Count; i++)
                {
                    TreeNode node = new TreeNode((string)dt.Rows[i]["FUNC_NAME"], (string)dt.Rows[i]["FUNC_ID"]);
                    node.Checked = sc.Contains(node.Value);
                    tnDic[(string)dt.Rows[i]["PARENT_FUNC"]].ChildNodes.Add(node);
                }


            }



        }
    }
    protected void DDLRoles_SelectedIndexChanged(object sender, EventArgs e)
    {
        BindTree(DDLRoles.SelectedValue);
    }



    /// <summary>
    /// 保存权限设置
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void BtnSaveRoleFuncSetting_Click(object sender, EventArgs e)
    {
        System.Collections.Specialized.StringCollection sc = new System.Collections.Specialized.StringCollection();        
        //从根开始遍历
        foreach (TreeNode tn in TreeViewFuncs.Nodes)
        {
            FindCheckedNodes(tn, sc);
        }
        //sc中包含了所有已经选中的节点
        string role_id = DDLRoles.SelectedValue;

        //将此sc中的节点同步到数据库
        //步骤：1、清除所有原来的节点；2、事务性的逐条插入
        DaRoleFunction darf = new DaRoleFunction(DaCommon.DefaultDb);
        if (sc.Count > 0)
        {
            string[] funcs = new string[sc.Count];
            sc.CopyTo(funcs, 0);
            darf.SetRoleFuncs(role_id, funcs);
        }
        else
        {
            darf.ClearRoleFuncs(role_id);
        }

        BindTree(role_id);
        Utility.InitRoleManifest();

    }
    
    private void FindCheckedNodes(TreeNode tn,System.Collections.Specialized.StringCollection sc)
    {
        //把本级和第一级子节点中，选中的全部添加到集合中
        if (tn.Checked && !sc.Contains(tn.Value))
        {
            sc.Add(tn.Value);
        }

        //处理子节点
        foreach (TreeNode child in tn.ChildNodes)
        {
            if (child.Checked && !sc.Contains(child.Value))
            {
                sc.Add(child.Value);
            }
            FindCheckedNodes(child, sc);
        }
        //sc中包含了所有已经选中的节点
         
    }

}
